//
// Created by Mzoro on 2022/4/15.
//

#include <stdio.h>
#include <string.h>

#define prd(exp) printf(#exp " : %d\n", exp)
#define prs(exp) printf(#exp " : %s\n", exp)

struct point {
        const int x;
        int y;
};

struct name {
    char *first;
    char *last;
};

struct point addY(struct point a, struct point b);
struct name changeName(struct name);
struct name changeName2(struct name *a);
int main(){
    setbuf(stdout, NULL);
    // 即使化的顺序和声明的顺序一样，下面第一个值是给x的初始值，第二个是y的
    struct point a = {
            1,2
    };
    prd(a.x);
    prd(a.y);
    // 不可，因为x是用const 修饰的
//    a.x = 3;
    a.y = 4;

    //下面这种是GNU风格
    struct point b = {
        x:3,
        y:4
    };
    prd(b.x);
    prd(b.y);

    // 结构传作为参数入参，是值传递的 ，可以看到虽然addY方法中使用了 a.y += b.y ,但main方法中的a.y的值没有变
    struct point result = addY(a,b);
    prd(a.y);
    prd(result.y);

    struct point c = {
            .y = 20,
            .x = 10
    };
    prd(c.x);
    prd(c.y);

    struct name d;
    d.first = "哈哈";
    d.last = "哦";
    prs(d.first);
    prs(d.last);

    // struct 作为参数，是值传递的，方法内部会改结构体的值， 不会影响原有的struct
    struct name changeD = changeName(d);
    prs(d.first);
    prs(changeD.first);

    struct name changeD2 = changeName2(&d);
    prs(d.first);
    prs(changeD2.first);
}

struct point addY(struct point a, struct point b){
    a.y += b.y;
    return a;
}
struct name changeName(struct name a){
    a.first = "2";
    return a;
}
struct name changeName2(struct name *a){
    (*a).first = "change2";
    // 对于指针变量，访问结构体成员的另一种方式
    a->last = "change2";
    return *a;
}